/*!
 * # 数据实体类:
 *  Date - 日期
 * 
 * # 描述:
 *  表示一个已经安排的工作日或节假日。没有安排的日期将按照默认的规则计算，默认规则如下：周一到周五的为工作日，周六和周日的日期为节假日。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Calendar.Everyone.Data
{
	/// <summary>
	/// 日期。
	/// </summary>
	/// <remarks>
	/// 表示一个已经安排的工作日或节假日。没有安排的日期将按照默认的规则计算，默认规则如下：周一到周五的为工作日，周六和周日的日期为节假日。
	/// </remarks>
	public sealed class Date : global::Pittypat.DataModel
	{
		#region 构造函数

		/// <summary>
		/// 初始化 Date 类的一个新实例。
		/// </summary>
		public Date()
		{
			// 日期值
			this.Value = null;
			// 是否工作日
			this.IsWorkday = null;
			// 节日名称
			this.Festivals = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置日期值。
		/// </summary>
		/// <remarks>
		/// 目标日期的值。
		/// </remarks>
		public @date? Value { get; set; }

		/// <summary>
		/// 获取或者设置是否工作日。
		/// </summary>
		/// <remarks>
		/// 指示目标日期是否是一个工作日：true-是工作日，false-是节假日。
		/// </remarks>
		public @bool? IsWorkday { get; set; }

		/// <summary>
		/// 获取或者设置节日名称。
		/// </summary>
		/// <remarks>
		/// 日期对应的节日的名称。
		/// </remarks>
		public @string? Festivals { get; set; }

		#endregion

		#region 方法

		/// <summary>
		/// 从一个 DbDataReader 中读取此对象。
		/// </summary>
		/// <param name="reader">包含对象数据的 DbDataReader 对象。</param>
		/// <exception cref="global::System.ArgumentNullException">reader 是 null。</exception>
		public override void Read(global::System.Data.Common.DbDataReader reader)
		{
			if (reader == null)
			{
				throw new global::System.ArgumentNullException("reader");
			}

			// 日期值
			this.Value = reader.GetValue<@date>("Value", defaultValue: this.Value);

			// 是否工作日
			this.IsWorkday = reader.GetValue<@bool>("IsWorkday", defaultValue: this.IsWorkday);

			// 节日名称
			this.Festivals = reader.GetValue<@string>("Festivals", defaultValue: this.Festivals);
		}

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// 日期值
			writer.Write("\"value\":");
			this.Value.Write(writer);
			writer.Write(',');

			// 是否工作日
			writer.Write("\"isWorkday\":");
			this.IsWorkday.Write(writer);
			writer.Write(',');

			// 节日名称
			writer.Write("\"festivals\":");
			this.Festivals.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
